View Javadoc

1   package org.votech.ds6.plastlets;
2   
3   import java.awt.Container;
4   import java.awt.event.ActionEvent;
5   import java.awt.event.ActionListener;
6   import java.awt.event.WindowAdapter;
7   import java.awt.event.WindowEvent;
8   import java.net.MalformedURLException;
9   import java.net.URL;
10  import java.util.Collection;
11  
12  import javax.jnlp.ServiceManager;
13  import javax.jnlp.SingleInstanceListener;
14  import javax.jnlp.SingleInstanceService;
15  import javax.jnlp.UnavailableServiceException;
16  import javax.swing.AbstractButton;
17  import javax.swing.BoxLayout;
18  import javax.swing.ImageIcon;
19  import javax.swing.JFrame;
20  import javax.swing.JPanel;
21  import javax.swing.SwingUtilities;
22  
23  import org.apache.commons.logging.Log;
24  import org.apache.commons.logging.LogFactory;
25  import org.astrogrid.acr.ACRException;
26  import org.jdesktop.jdic.desktop.Desktop;
27  import org.votech.ds6.paf.PlasticPanel;
28  import org.votech.ds6.plastlets.PlastletsManager.PlastletChangeListener;
29  import org.votech.plastic.PlasticListener;
30  import org.votech.plastic.incoming.handlers.StandardHandler;
31  import org.votech.plastic.managers.AcrManager;
32  import org.votech.plastic.managers.PlasticManager;
33  
34  /***
35   * Main entry point for registering and starting plastlets.
36   * @author jdt
37   *
38   */
39  public class Main extends JFrame implements PlastletChangeListener {
40  	/***
41  	 * 
42  	 */
43  	private static final long serialVersionUID = 1L;
44  
45  	/***
46  	 * Logger for this class
47  	 */
48  	private static final Log logger = LogFactory.getLog(Main.class);
49  
50  	public static final String BASEURL = "http://plastic.sourceforge.net/multiproject/plastlets";
51  	public static final String LOGO = BASEURL+"/images/plastlets.gif";
52  	
53  
54  	public static final String IVORN = "ivo://blank";
55  
56  	public static final String NAME = "Standalone-Plastlets-Manager";
57  
58  	public static final String DESCRIPTION = "The Plastlets manager is responsible for (surprise, surprise) managing <a href='"+BASEURL+"'>Plastlets</a>.  Plastlets are small Plastic applications. More soon...";
59  
60  	protected static final String HELP_URL = "http://plastic.sourceforge.net/multiproject/plastletweb/help.html"; 
61  	
62  	private PlastletsManager plastletsManager;
63  
64  	public static void main(String[] args) throws ACRException  {
65  		JFrame frame = new Main();
66  		frame.setVisible(true);
67  		
68  	}
69  	
70  	public Main() {
71  		imageicon = new ImageIcon(this.getClass().getResource("plastlets.jpg"));
72  		
73  		setDesktopIntegration();
74  		
75  		logger.info("Initialising Plastic Manager");
76  		StandardHandler handler = new StandardHandler(NAME, DESCRIPTION, IVORN, LOGO, PlasticListener.CURRENT_VERSION); 
77  		PlasticManager plasticManager = new PlasticManager(NAME,handler,false,10000);
78  	
79  		logger.info("Initialising ACRManager");
80  		AcrManager acrManager = new AcrManager(false, 10000,NAME);
81  
82  	
83  		plastletsManager = new PlastletsManager(acrManager, plasticManager);
84  		plastletsManager.add(this);
85  		plastletsManager.createAndRegisterAllPlastlets(); //TODO this won't work till plastic is connected
86  		initGui();
87  
88  		logger.debug("Managers will connect when ready");
89  		plasticManager.connectWhenReady();
90  		acrManager.connect(false);
91  	}
92  
93  	private void setDesktopIntegration() {
94  		final VisibilityManager visibilityManager = new VisibilityManager(this, imageicon);
95  		//Webstart integration: make this a singleton
96  	       try {
97  	           // Lookup the javax.jnlp.SingleInstanceService object
98  	           SingleInstanceService sis = (SingleInstanceService)ServiceManager.lookup("javax.jnlp.SingleInstanceService");
99  	           sis.addSingleInstanceListener(new SingleInstanceListener() {
100 
101 				public void newActivation(String[] arg0) {
102 					logger.info("User has attempted to start another instance - make ourselves visible");
103 					visibilityManager.setVisible(true);
104 				}
105 	        	   
106 	           });
107 	           
108 	       } catch(UnavailableServiceException ue) {
109 	           logger.info("SingleInstanceService not available - not running under webstart 5 or above");
110 	           return;
111 	       } 
112 	}
113 
114 	private void initGui() {
115 		logger.debug("Initialising GUI");
116 		addWindowListener(new WindowAdapter() {
117 
118 			/* (non-Javadoc)
119 			 * @see java.awt.event.WindowAdapter#windowClosed(java.awt.event.WindowEvent)
120 			 */
121 			@Override
122 			public void windowClosing(WindowEvent arg0) {
123 				super.windowClosing(arg0);
124 				logger.info("Shutting down");
125 				shutDown();
126 			}
127 			
128 		});
129 		setTitle("Plastlets");
130 		
131 		setIconImage(imageicon.getImage());
132 		Container pane = getContentPane();
133 		PlasticPanel plasticPanel;
134 		if (CheckJDICPresent.desktop.check()) {
135 			//Should be able to control system browser so can add the help button
136 			plasticPanel = new PlasticPanel(true,true,true,false);
137 			plasticPanel.addHelpListener(new ActionListener() {
138 
139 				public void actionPerformed(ActionEvent arg0) {
140 					try {
141 						Desktop.browse(new URL(HELP_URL));
142 					} catch (Exception e) {
143 						logger.error("Couldn't open help page in browser ",e);
144 					}
145 					
146 				}
147 				
148 			});
149 		} else {
150 			plasticPanel = new PlasticPanel(true,true,false,false);
151 		}
152 		pane.add(plasticPanel);
153 		workingPane = new JPanel();
154 		plasticPanel.add(workingPane);
155 		
156 
157 		
158 		PlasticManager plasticManager = plastletsManager.getPlasticManager();
159 		AcrManager acrManager = plastletsManager.getAcrManager();
160 		plasticManager.addObserver(plasticManager.new ObserverAdaptor(plasticPanel));
161 		acrManager.addObserver(acrManager.new ObserverAdaptor(plasticPanel));
162 		
163 	
164 		pack();
165 	}
166 
167 	protected void shutDown() {
168 		plastletsManager.shutDown();
169 		System.exit(0);
170 		
171 	}
172 
173 	public void plastletsChanged() {
174 		refreshGUI();
175 	}
176 
177 	private Container workingPane = new JPanel(); //tmp to avoid nulls
178 
179 	private ImageIcon imageicon;
180 	private void refreshGUI() {
181 		SwingUtilities.invokeLater(new Runnable() {
182 			public void run() {
183 				logger.debug("Refreshing GUI");
184 				workingPane.removeAll();
185 				workingPane.setLayout(new BoxLayout(workingPane, BoxLayout.PAGE_AXIS));
186 				Collection<Plastlet> plastlets = plastletsManager.getPlastlets();
187 				for (final Plastlet plastlet: plastlets) {
188 					PlastletMetaData meta = plastlet.getMetaData();
189 					String name = meta.getName();
190 					String desc = meta.getDescription();
191 					String logo = meta.getLogoUrl();
192 					URL logoUrl = null;
193 					try {
194 						logoUrl = new URL(logo);
195 					} catch (MalformedURLException e) {
196 						logger.warn("Couldn't get logo from "+logo,e);
197 						
198 					}
199 					
200 					final AbstractButton button = new JOnOffButton(name);
201 					if (logoUrl!=null) {
202 						button.setIcon(new ImageIcon(logoUrl));
203 					}
204 
205 					button.setToolTipText(desc);
206 					logger.debug("Adding button for "+name);
207 					workingPane.add(button);
208 					button.addActionListener(new ActionListener() {
209 
210 						public void actionPerformed(ActionEvent arg0) {
211 							plastletsManager.enablePlastlet(plastlet, button.isSelected());
212 						}
213 						
214 					});
215 					
216 				}	
217                 workingPane.validate();
218 				pack();
219 			}});
220 		}
221 
222 }